/*
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.gitee.wsl.compose.ui.preference

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.material3.Divider
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.gitee.wsl.config.AbstractConfigModel

/*interface Preferences {
    operator fun <T> get(key: String): T?

    fun asMap(): Map<String, Any>

    fun toPreferences(): Preferences = toMutablePreferences()

    fun toMutablePreferences(): MutablePreferences
}

internal class MapPreferences(private val map: Map<String, Any> = emptyMap()) : Preferences {
    @Suppress("UNCHECKED_CAST") override fun <T> get(key: String): T? = map[key] as T?

    override fun asMap(): Map<String, Any> = map

    override fun toMutablePreferences(): MutablePreferences =
        MapMutablePreferences(map.toMutableMap())
}

interface MutablePreferences : Preferences {
    operator fun <T> set(key: String, value: T?)

    fun remove(key: String) {
        set(key, null)
    }

    operator fun minusAssign(key: String) {
        remove(key)
    }

    fun clear()
}

internal class MapMutablePreferences(private val map: MutableMap<String, Any> = mutableMapOf()) :
    MutablePreferences {
    @Suppress("UNCHECKED_CAST") override fun <T> get(key: String): T? = map[key] as T?

    override fun asMap(): Map<String, Any> = map

    override fun toMutablePreferences(): MutablePreferences =
        MapMutablePreferences(map.toMutableMap())

    override fun <T> set(key: String, value: T?) {
        if (value != null) {
            map[key] = value
        } else {
            map -= key
        }
    }

    override fun clear() {
        map.clear()
    }
}*/

lateinit var LocalPrefsDataStore: ProvidableCompositionLocal<AbstractConfigModel>

/**
 * Main preference screen which holds [PrefsListItem]s
 *
 * @param dataStore DataStore which will be used to save all the preferences
 * @param modifier Modifier applied to the [LazyColumn] holding the list of Prefs
 *
 */
@Composable
fun PrefsScreen(
    dataStore: AbstractConfigModel,
    modifier: Modifier = Modifier,
    dividerThickness: Dp = 1.dp, // 0 for no divider
    dividerIndent: Dp = 0.dp, // indents on both sides
    content: LazyListScope.() -> Unit
) {
    LocalPrefsDataStore = staticCompositionLocalOf { dataStore }
    //val prefsScope = PrefsScopeImpl().apply(content)

    // Now the dataStore can be accessed by calling LocalPrefsDataStore.current from any child Pref
    CompositionLocalProvider(LocalPrefsDataStore provides dataStore) {
        Column {
            Spacer(modifier = Modifier.height(12.dp))
            LazyColumn(modifier = modifier.fillMaxSize()) {

                items(dataStore.size) { index ->
                    //prefsScope.getPrefsItem(index)()

                   /* if (dividerThickness != 0.dp
                        && index != prefsScope.prefsItems.size - 1
                        && !prefsScope.headerIndexes.contains(index)
                        && !prefsScope.headerIndexes.contains(index + 1)
                        && !prefsScope.footerIndexes.contains(index)
                    ) {
                        Divider(
                            thickness = dividerThickness,
                            //indent = dividerIndent
                        )
                    }*/
                }
            }
        }
    }
}
